package com.caocaog.market.finance.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.caocaog.market.finance.entity.FinanceLine;
import com.caocaog.market.finance.enums.WithdrawStatus;
import com.caocaog.market.finance.enums.WithdrawType;
import org.springframework.validation.annotation.Validated;

import javax.annotation.Nullable;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;

@Validated
public interface FinanceLineService extends IService<FinanceLine> {

    /**
     * 查询结算行分页信息
     * 系统用户不用传递 siteId 与 shopId
     *
     * @param siteId 分站用户需传递此参数
     * @param merchantId 商家用户需传递此参数
     */
    IPage<FinanceLine> queryFinanceLinePage(Page<FinanceLine> page,
                                            FinanceLine financeLine,
                                            @Nullable String siteId,
                                            @Nullable String merchantId);


    /**
     * 创建提现行
     */
    Integer createFinanceLine(@NotNull @Valid FinanceLine financeLine);


    /**
     * 更新提现行
     */
    Integer updateFinanceLine(@NotNull FinanceLine financeLine);


    /**
     * 根据提现集id查询提现行
     */
    List<FinanceLine> getFinanceLineListByGroupId(Long groupId);


    /**
     * 获取所有需要结算的订单（定时任务）
     * 结算状态为待结算，并且订单状态为已完成
     */
    List<FinanceLine> findNeedSettlement(int settlementDay);


    /**
     * 批量更新为已结算（定时任务）
     */
    Integer updateFinanceLineSettled(List<Long> ids);


    /**
     * 批量更新提现行状态
     */
    Integer updateFinanceLineStatus(@NotNull @Size(min = 1, max = FinanceGroupService.MAX_WITHDRAW_COUNT) List<Long> ids,
                                    @NotNull WithdrawType type,
                                    @NotNull WithdrawStatus status);

    /**
     * 批量更新提现行状态（缓存）
     */
    Integer updateFinanceLineStatus(@NotNull @Size(min = 1, max = FinanceGroupService.MAX_WITHDRAW_COUNT) List<Long> ids,
                                    @NotNull WithdrawType type,
                                    @NotNull WithdrawStatus status,
                                    @NotNull Long groupId);


    /**
     * 校验集合内部提现行状态（创建提现集的时候）
     * 需要保证提现行的状态都是待提现的
     */
    Boolean checkFinanceLineUnWithdrawCount(List<Long> ids, WithdrawType type);


    /**
     * 根据提现行id查询店铺ids（商家创建提现集的时候校验「商家批量提现只能提同一店铺的」）
     */
    List<String> getFinanceLineShopIds(List<Long> ids);


    /**
     * 根据订单id获取提现行
     */
    FinanceLine getFinanceLineByOrderId(String orderId);


    /**
     * 根据订单ID删除提现行（退款的时候删除，因为还能退款，所以肯定还没有结算）
     */
    Integer deleteFinanceLineByOrderId(String orderId);

}
